<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>Dynamic templates | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'dynamic-templates.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/dynamic-templates.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/dynamic-templates.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/dynamic-templates.html" rel="nofollow" target="_blank">../en/dynamic-templates.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch Guide [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="mapping.html">Mapping</a></span>
»
<span class="breadcrumb-link"><a href="dynamic-mapping.html">Dynamic Mapping</a></span>
»
<span class="breadcrumb-node">Dynamic templates</span>
</div>
<div class="navheader">
<span class="prev">
<a href="dynamic-field-mapping.html">« Dynamic field mapping</a>
</span>
<span class="next">
<a href="analysis.html">Text analysis »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="dynamic-templates"></a>Dynamic templates<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/mapping/dynamic/templates.asciidoc">edit</a>
</h2>
</div></div></div>
<p>Dynamic templates allow you to define custom mappings that can be applied to
dynamically added fields based on:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
the <a class="xref" href="dynamic-mapping.html" title="Dynamic Mapping">datatype</a> detected by Elasticsearch, with <a class="xref" href="dynamic-templates.html#match-mapping-type" title="match_mapping_type"><code class="literal">match_mapping_type</code></a>.
</li>
<li class="listitem">
the name of the field, with <a class="xref" href="dynamic-templates.html#match-unmatch" title="match and unmatch"><code class="literal">match</code> and <code class="literal">unmatch</code></a> or <a class="xref" href="dynamic-templates.html#match-pattern" title="match_pattern"><code class="literal">match_pattern</code></a>.
</li>
<li class="listitem">
the full dotted path to the field, with <a class="xref" href="dynamic-templates.html#path-match-unmatch" title="path_match and path_unmatch"><code class="literal">path_match</code> and <code class="literal">path_unmatch</code></a>.
</li>
</ul>
</div>
<p>The original field name <code class="literal">{name}</code> and the detected datatype
<code class="literal">{dynamic_type}</code> <a class="xref" href="dynamic-templates.html#template-variables" title="{name} and {dynamic_type}">template variables</a> can be used in
the mapping specification as placeholders.</p>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<p>Dynamic field mappings are only added when a field contains a
concrete value — not <code class="literal">null</code> or an empty array. This means that if the
<code class="literal">null_value</code> option is used in a <code class="literal">dynamic_template</code>, it will only be applied
after the first document with a concrete value for the field has been
indexed.</p>
</div>
</div>
<p>Dynamic templates are specified as an array of named objects:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">  "dynamic_templates": [
    {
      "my_template_name": { <a id="CO364-1"></a><i class="conum" data-value="1"></i>
        ...  match conditions ... <a id="CO364-2"></a><i class="conum" data-value="2"></i>
        "mapping": { ... } <a id="CO364-3"></a><i class="conum" data-value="3"></i>
      }
    },
    ...
  ]</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO364-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The template name can be any string value.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO364-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>The match conditions can include any of : <code class="literal">match_mapping_type</code>, <code class="literal">match</code>, <code class="literal">match_pattern</code>, <code class="literal">unmatch</code>, <code class="literal">path_match</code>, <code class="literal">path_unmatch</code>.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO364-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>The mapping that the matched field should use.</p>
</td>
</tr>
</table>
</div>
<p>If a provided mapping contains an invalid mapping snippet, a validation error
is returned. Validation occurs when applying the dynamic template at index time,
and, in most cases, when the dynamic template is updated. Providing an invalid mapping
snippet may cause the update or validation of a dynamic template to fail under certain conditions:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
If no <code class="literal">match_mapping_type</code> has been specified but the template is valid for at least one predefined mapping type,
the mapping snippet is considered valid. However, a validation error is returned at index time if a field matching
the template is indexed as a different type. For example, configuring a dynamic template with no <code class="literal">match_mapping_type</code>
is considered valid as string type, but if a field matching the dynamic template is indexed as a long, a validation
error is returned at index time.
</li>
<li class="listitem">
If the <code class="literal">{{name}}</code> placeholder is used in the mapping snippet, validation is skipped when updating the dynamic
template. This is because the field name is unknown at that time. Instead, validation occurs when the template is applied
at index time.
</li>
</ul>
</div>
<p>Templates are processed in order — the first matching template wins. When
putting new dynamic templates through the <a class="xref" href="indices-put-mapping.html" title="Put mapping API">put mapping</a> API,
all existing templates are overwritten. This allows for dynamic templates to be
reordered or deleted after they were initially added.</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="match-mapping-type"></a><code class="literal">match_mapping_type</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/mapping/dynamic/templates.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">match_mapping_type</code> is the datatype detected by the JSON parser. Since
JSON doesn’t distinguish a <code class="literal">long</code> from an <code class="literal">integer</code> or a <code class="literal">double</code> from
a <code class="literal">float</code>, it will always choose the wider datatype, i.e. <code class="literal">long</code> for integers
and <code class="literal">double</code> for floating-point numbers.</p>
<p>The following datatypes may be automatically detected:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">boolean</code> when <code class="literal">true</code> or <code class="literal">false</code> are encountered.
</li>
<li class="listitem">
<code class="literal">date</code> when <a class="xref" href="dynamic-field-mapping.html#date-detection" title="Date detection">date detection</a> is enabled and a string matching
any of the configured date formats is found.
</li>
<li class="listitem">
<code class="literal">double</code> for numbers with a decimal part.
</li>
<li class="listitem">
<code class="literal">long</code> for numbers without a decimal part.
</li>
<li class="listitem">
<code class="literal">object</code> for objects, also called hashes.
</li>
<li class="listitem">
<code class="literal">string</code> for character strings.
</li>
</ul>
</div>
<p><code class="literal">*</code> may also be used in order to match all datatypes.</p>
<p>For example, if we wanted to map all integer fields as <code class="literal">integer</code> instead of
<code class="literal">long</code>, and all <code class="literal">string</code> fields as both <code class="literal">text</code> and <code class="literal">keyword</code>, we
could use the following template:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "integers": {
          "match_mapping_type": "long",
          "mapping": {
            "type": "integer"
          }
        }
      },
      {
        "strings": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "text",
            "fields": {
              "raw": {
                "type":  "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    ]
  }
}

PUT my_index/_doc/1
{
  "my_integer": 5, <a id="CO365-1"></a><i class="conum" data-value="1"></i>
  "my_string": "Some string" <a id="CO365-2"></a><i class="conum" data-value="2"></i>
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/787.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO365-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">my_integer</code> field is mapped as an <code class="literal">integer</code>.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO365-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">my_string</code> field is mapped as a <code class="literal">text</code>, with a <code class="literal">keyword</code> <a class="xref" href="multi-fields.html" title="fields">multi field</a>.</p>
</td>
</tr>
</table>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="match-unmatch"></a><code class="literal">match</code> and <code class="literal">unmatch</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/mapping/dynamic/templates.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">match</code> parameter uses a pattern to match on the field name, while
<code class="literal">unmatch</code> uses a pattern to exclude fields matched by <code class="literal">match</code>.</p>
<p>The following example matches all <code class="literal">string</code> fields whose name starts with
<code class="literal">long_</code> (except for those which end with <code class="literal">_text</code>) and maps them as <code class="literal">long</code>
fields:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "longs_as_strings": {
          "match_mapping_type": "string",
          "match":   "long_*",
          "unmatch": "*_text",
          "mapping": {
            "type": "long"
          }
        }
      }
    ]
  }
}

PUT my_index/_doc/1
{
  "long_num": "5", <a id="CO366-1"></a><i class="conum" data-value="1"></i>
  "long_text": "foo" <a id="CO366-2"></a><i class="conum" data-value="2"></i>
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/788.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO366-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">long_num</code> field is mapped as a <code class="literal">long</code>.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO366-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">long_text</code> field uses the default <code class="literal">string</code> mapping.</p>
</td>
</tr>
</table>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="match-pattern"></a><code class="literal">match_pattern</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/mapping/dynamic/templates.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">match_pattern</code> parameter adjusts the behavior of the <code class="literal">match</code> parameter
such that it supports full Java regular expression matching on the field name
instead of simple wildcards, for instance:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">  "match_pattern": "regex",
  "match": "^profit_\d+$"</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="path-match-unmatch"></a><code class="literal">path_match</code> and <code class="literal">path_unmatch</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/mapping/dynamic/templates.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">path_match</code> and <code class="literal">path_unmatch</code> parameters work in the same way as <code class="literal">match</code>
and <code class="literal">unmatch</code>, but operate on the full dotted path to the field, not just the
final name, e.g. <code class="literal">some_object.*.some_field</code>.</p>
<p>This example copies the values of any fields in the <code class="literal">name</code> object to the
top-level <code class="literal">full_name</code> field, except for the <code class="literal">middle</code> field:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "full_name": {
          "path_match":   "name.*",
          "path_unmatch": "*.middle",
          "mapping": {
            "type":       "text",
            "copy_to":    "full_name"
          }
        }
      }
    ]
  }
}

PUT my_index/_doc/1
{
  "name": {
    "first":  "John",
    "middle": "Winston",
    "last":   "Lennon"
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/789.console"></div>
<p>Note that the <code class="literal">path_match</code> and <code class="literal">path_unmatch</code> parameters match on object paths
in addition to leaf fields. As an example, indexing the following document will
result in an error because the <code class="literal">path_match</code> setting also matches the object
field <code class="literal">name.title</code>, which can’t be mapped as text:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index/_doc/2
{
  "name": {
    "first":  "Paul",
    "last":   "McCartney",
    "title": {
      "value": "Sir",
      "category": "order of chivalry"
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/790.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="template-variables"></a><code class="literal">{name}</code> and <code class="literal">{dynamic_type}</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/mapping/dynamic/templates.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">{name}</code> and <code class="literal">{dynamic_type}</code> placeholders are replaced in the <code class="literal">mapping</code>
with the field name and detected dynamic type.  The following example sets all
string fields to use an <a class="xref" href="analyzer.html" title="analyzer"><code class="literal">analyzer</code></a> with the same name as the
field, and disables <a class="xref" href="doc-values.html" title="doc_values"><code class="literal">doc_values</code></a> for all non-string fields:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "named_analyzers": {
          "match_mapping_type": "string",
          "match": "*",
          "mapping": {
            "type": "text",
            "analyzer": "{name}"
          }
        }
      },
      {
        "no_doc_values": {
          "match_mapping_type":"*",
          "mapping": {
            "type": "{dynamic_type}",
            "doc_values": false
          }
        }
      }
    ]
  }
}

PUT my_index/_doc/1
{
  "english": "Some English text", <a id="CO367-1"></a><i class="conum" data-value="1"></i>
  "count":   5 <a id="CO367-2"></a><i class="conum" data-value="2"></i>
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/791.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO367-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">english</code> field is mapped as a <code class="literal">string</code> field with the <code class="literal">english</code> analyzer.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO367-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">count</code> field is mapped as a <code class="literal">long</code> field with <code class="literal">doc_values</code> disabled.</p>
</td>
</tr>
</table>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="template-examples"></a>Template examples<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/mapping/dynamic/templates.asciidoc">edit</a>
</h3>
</div></div></div>
<p>Here are some examples of potentially useful dynamic templates:</p>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_structured_search"></a>Structured search<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/mapping/dynamic/templates.asciidoc">edit</a>
</h4>
</div></div></div>
<p>By default Elasticsearch will map string fields as a <code class="literal">text</code> field with a sub
<code class="literal">keyword</code> field. However if you are only indexing structured content and not
interested in full text search, you can make Elasticsearch map your fields
only as `keyword`s. Note that this means that in order to search those fields,
you will have to search on the exact same value that was indexed.</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "strings_as_keywords": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/792.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="text-only-mappings-strings"></a><code class="literal">text</code>-only mappings for strings<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/mapping/dynamic/templates.asciidoc">edit</a>
</h4>
</div></div></div>
<p>On the contrary to the previous example, if the only thing that you care about
on your string fields is full-text search, and if you don’t plan on running
aggregations, sorting or exact search on your string fields, you could tell
Elasticsearch to map it only as a text field (which was the default behaviour
before 5.0):</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "strings_as_text": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "text"
          }
        }
      }
    ]
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/793.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_disabled_norms"></a>Disabled norms<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/mapping/dynamic/templates.asciidoc">edit</a>
</h4>
</div></div></div>
<p>Norms are index-time scoring factors. If you do not care about scoring, which
would be the case for instance if you never sort documents by score, you could
disable the storage of these scoring factors in the index and save some space.</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "strings_as_keywords": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "text",
            "norms": false,
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    ]
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/794.console"></div>
<p>The sub <code class="literal">keyword</code> field appears in this template to be consistent with the
default rules of dynamic mappings. Of course if you do not need them because
you don’t need to perform exact search or aggregate on this field, you could
remove it as described in the previous section.</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_time_series"></a>Time-series<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/mapping/dynamic/templates.asciidoc">edit</a>
</h4>
</div></div></div>
<p>When doing time series analysis with Elasticsearch, it is common to have many
numeric fields that you will often aggregate on but never filter on. In such a
case, you could disable indexing on those fields to save disk space and also
maybe gain some indexing speed:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "unindexed_longs": {
          "match_mapping_type": "long",
          "mapping": {
            "type": "long",
            "index": false
          }
        }
      },
      {
        "unindexed_doubles": {
          "match_mapping_type": "double",
          "mapping": {
            "type": "float", <a id="CO368-1"></a><i class="conum" data-value="1"></i>
            "index": false
          }
        }
      }
    ]
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/795.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO368-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>Like the default dynamic mapping rules, doubles are mapped as floats, which
are usually accurate enough, yet require half the disk space.</p>
</td>
</tr>
</table>
</div>
</div>

</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="dynamic-field-mapping.html">« Dynamic field mapping</a>
</span>
<span class="next">
<a href="analysis.html">Text analysis »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>